<?php
class Delivery_Model_Pedido 
	extends Delivery_Model_Abstract
{
	
	public $idPedido;
	public $idNegocio;
	public $idCliente;
	public $idDireccionCliente;	
	public $notasNegocio;
	public $notasCliente;
	public $costoEnvio;	
	public $precioFinal;
	public $estado;
	public $fechaEntrega;
	public $fechaCreacion;
	public $fechaCancelacion;
	public $pagaCon;
	
	public static $error;
		
	protected static $estadoPedido		= 1;
	protected static $estadoAceptado	= 2;
	protected static $estadoEnviado		= 3;
	protected static $estadoFinalizado	= 4;
	protected static $estadoRechazado	= 5;
	protected static $estadoCancelado	= 6;
	
	protected $_negocio;
	protected $_cliente;
	protected $_direccion;
	protected $_productos;
	protected $_promociones;
	protected $_voto;
	
	const PEDIDO 	= 1;
	const ACEPTADO	= 2;
	const ENVIADO	= 3;
	const FINALIZADO= 4;
	const RECHAZADO	= 5;
	const CANCELADO	= 6;
	
	const CLOSETIME	= 15;
	
	protected static $estados = array(
		1	=> 'pedido',
		2	=> 'aceptado',
		3	=> 'enviado',
		4	=> 'finalizado',
		5	=> 'rechazado',
		6	=> 'cancelado'
	);
	
	
	public function getId()
	{
		return $this->idPedido;	
	}
	
	public function isDelivery ()
	{
		return ! is_null( $this->idDireccionCliente );
	}
	
	public function isPickup ()
	{
		return is_null( $this->idDireccionCliente );
	}
	
	public function getNegocio()
	{
		return $this->_negocio;
	}
	
	public function setNegocio( $negocio )
	{
		$this->_negocio = $negocio;
		return $this;
	}
	
	public function getDireccion()
	{
		return $this->_direccion;
	}
	
	public function setDireccion( $direccion )
	{
		$this->_direccion = $direccion;
		return $this;
	}
	
	public function getCliente()
	{
		return $this->_cliente;
	}
	
	public function setCliente( $cliente )
	{
		$this->_cliente = $cliente;
		return $this;
	}
	
	public function getProductos()
	{
		return $this->_productos;
	}
	
	public function setProductos( $productos )
	{
		$this->_productos = $productos;
		return $this;
	}
	
	public function getPromociones()
	{
		return $this->_promociones;
	}
	
	public function setPromociones( $promociones )
	{
		$this->_promociones = $promociones;
		return $this;
	}
	
    public function getVoto()
	{
		return $this->_voto;
	}
	
	public function setVoto( $voto )
	{
		$this->_voto = $voto;
		return $this;
	}
	
	public function getEstado()
	{
		return self::$estados[$this->estado];
	}
	
	public static function getEstados()
	{
		return self::$estados;
	}
	
	/**
	 * Controlla si el pedido puede ser aceptado dependiendo del estado en el que se encuentre
	 * @return bool
	 */
	public function canBeAccepted(){
		return $this->estado == self::$estadoPedido;			
	}
	
	/**
	 * Controlla si el pedido puede ser rechazado por el negocio
	 * @return bool
	 */
	public function canBeRejected(){
		return $this->estado == self::$estadoPedido;
	}
	
	/**
	 * Controlla si el pedido puede ser cancelado por el cliente
	 * @return bool
	 */
	public function canBeCanceled(){
		return $this->estado == self::$estadoPedido;
	}
	
	/**
	 * Controlla si el pedido puede ser enviado al cliente
	 * @return bool
	 */
	public function canBeSent(){
		return $this->estado == self::$estadoAceptado;
	}	
	
	/**
	 * Controlla si el pedido puede ser finalizado
	 * @return bool
	 */
	public function canBeFinalized(){
		return $this->estado == self::$estadoEnviado;
	}
	
	public function aceptar()
	{				
		if ( ! $this->canBeAccepted() ){
			throw new Delivery_Model_Exception( Delivery_Model_Exception::ORDER_CANNOT_BE_ACEPTED );
		}
		
		$this->estado = self::$estadoAceptado;
	} 

	public function rechazar()
	{				
		if ( ! $this->canBeRejected() ){
			throw new Delivery_Model_Exception( Delivery_Model_Exception::ORDER_CANNOT_BE_REJECTED );
		}
			
		$this->estado = self::$estadoRechazado;
	}
	
	public function cancelar()
	{				
		if ( ! $this->canBeCanceled() ){
			throw new Delivery_Model_Exception( Delivery_Model_Exception::ORDER_CANNOT_BE_CANCELED );
		}
		
		$this->estado = self::$estadoCancelado;
	}
	
	public function enviar()
	{				
		if ( ! $this->canBeSent() ){
			throw new Delivery_Model_Exception( Delivery_Model_Exception::ORDER_CANNOT_BE_SENT );
		}
		
		$this->estado = self::$estadoEnviado;
	}
	
	public function finalizar()
	{				
		if ( ! $this->canBeFinalized() ){
			throw new Delivery_Model_Exception( Delivery_Model_Exception::ORDER_CANNOT_BE_FINALIZED );
		}
		
		$this->estado = self::$estadoFinalizado;
	}
	
    public function fueVotado(){
		return ! empty( $this->_voto );
	}
	
    public function fueFinalizado(){
		return $this->estado == self::FINALIZADO;
	}
	

}